﻿using System;
using System.Data;
using AuctionSite.Entities;
using System.Collections.Generic;
using System.Linq;
using AuctionSite.Utils;

namespace AuctionSite.BL
{
    public class ProdutoFacade
    {
        public const string FACADE_SESSION_NAME = "ProdutoFacade";

        private List<Categoria> _listCategoria;
        public List<Categoria> ListCategoria
        {
            get { return _listCategoria ?? (_listCategoria = BuscaCategorias()); }
            set { _listCategoria = value; }
        }

        private List<SubCategoria> _listSubCategoria;
        public List<SubCategoria> ListSubCategoria
        {
            get { return _listSubCategoria ?? (_listSubCategoria = BuscaSubCategorias()); }
            set { _listSubCategoria = value; }
        }

        private List<Categoria> BuscaCategorias()
        {
            CategoriaFacade categoriaFacade = new CategoriaFacade();
            return categoriaFacade.TodasCategorias();
        }

        private List<SubCategoria> BuscaSubCategorias()
        {
            SubCategoriaFacade subCategoriaFacade = new SubCategoriaFacade();
            return subCategoriaFacade.TodasSubCategorias();
        }

        public List<SubCategoria> SearchSubCategoria(int categoriaId)
        {
            return ListSubCategoria.Where(o => o.CategoriaId == categoriaId).ToList();
        }

        public List<Produto> ProdutosPorSubCategoria(decimal subCategoriaId)
        {
            ProdutoService produtoService = new ProdutoService();
            DataTable dt = produtoService.BuscaProdutoPorSubCategoria(subCategoriaId);

            return CarregaInfo.CarregaDataTable<Produto>(dt)
                        .Where(o => o.DataInicial <= DateTime.Now && o.DataFinal >= DateTime.Now)
                        .OrderBy(o => o.Descricao)
                        .ToList();
        }

        public List<Produto> ProdutosPorUsuario(decimal usuario)
        {
            ProdutoService produtoService = new ProdutoService();
            DataTable dt = produtoService.BuscaProdutoPorUsuario(usuario);

            return CarregaInfo.CarregaDataTable<Produto>(dt);
                        //.Where(o => o.DataInicial <= DateTime.Now && o.DataFinal >= DateTime.Now)
                        //.OrderBy(o => o.Descricao)
                        //.ToList();
        }

        public Produto ProdutoPorSubCategoria(decimal subCategoriaId, decimal produtoId)
        {
            return ProdutosPorSubCategoria(subCategoriaId).FirstOrDefault(o => o.Id == produtoId);
        }

        public Produto NovoProduto(
            string nome,
            string descricao,
            string categoria,
            string subCategoria,
            string valor,
            string imagem,
            string dataInicial,
            string dataFinal,
            string tipoLeilao,
            string usuario
            )
        {
            #region Validação "Campos Em branco"

            if (string.IsNullOrWhiteSpace(nome))
                throw new Exception("O nome é obrigatório");

            if (string.IsNullOrWhiteSpace(descricao))
                throw new Exception("O Descrição é obrigatório");

            if (string.IsNullOrWhiteSpace(dataInicial))
                throw new Exception("O Data Inicial é obrigatório");

            if (string.IsNullOrWhiteSpace(dataFinal))
                throw new Exception("O Data Final é obrigatório");

            if (string.IsNullOrWhiteSpace(valor))
                throw new Exception("O Valor é obrigatório");

            if (string.IsNullOrWhiteSpace(tipoLeilao))
                throw new Exception("A Tipo de Leilão é obrigatório");

            if (string.IsNullOrWhiteSpace(categoria))
                throw new Exception("A Categoria é obrigatório");

            if (string.IsNullOrWhiteSpace(subCategoria))
                throw new Exception("A SubCategoria é obrigatório");

            if (string.IsNullOrWhiteSpace(usuario))
                throw new Exception("Problema com a autenticação do usuário");

            #endregion

            Produto produto = new Produto();
            produto.UsuarioId = Convert.ToInt16(usuario);
            produto.CategoriaId = Convert.ToInt16(categoria);
            produto.SubCategoriaId = Convert.ToInt16(subCategoria);
            produto.Nome = nome;
            produto.Descricao = descricao;
            produto.Imagem1 = imagem;
            produto.Imagem2 = string.Empty;
            produto.Imagem3 = string.Empty;
            produto.Valor = Convert.ToDecimal(valor);
            produto.TipoLeilao = tipoLeilao;
            produto.DataInicial = Convert.ToDateTime(dataInicial);
            produto.DataFinal = Convert.ToDateTime(dataFinal);

            ProdutoService produtoService = new ProdutoService();
            return produtoService.Incluir(produto);
        }
    }
}